花了六天講解Index之後,不曉得大家對建立索引是否有一些概念,至少知到如何建立索引吧?
至於索引的優化個人覺得需要一點時間,去觀察資料庫使用的狀況,如果發現有哪個collection的搜尋特別慢,代表可能需要加上索引,或是原本的索引已經不適合現在的搜尋方式,需要做修正。
今天是講解MongoDB技術文章的最後一天,輕鬆一點只介紹bulkWrite的用法,這個方法可以讓我們一次寫入多個不同的資料操作,操作的種類有以下這些。
假設我們目前資料庫,有以下這些商品資料
{ name: "鍵盤", price: 3000, amount: 20, category: "3C" },
{ name: "小說", price: 240, amount: 120, category: "圖書" },
{ name: "帝王蟹", price: 4000, amount: 3, category: "食品" }
基本上bulkWrite寫法和aggregate很像,都是在陣列內寫入要執行的操作,而insertOne就和$match類似,代表要執行的操作,後面寫入要操作的資料。如果我們要新增一筆商品資料,可以這樣寫。
product.bulkWrite([
{
insertOne: {
"document": {
name: "小魚乾",
price: 300,
amount: 25,
category: "食品"
}
}
}
]);
// 執行結果會寫入一筆資料
{ _id: 4, name: "小魚乾", price: 300, amount: 25, category: "食品" }
如果我們想要更新商品資料,可以使用updateOne,它只會更新符合filter條件的第一筆資料,但如果使用的是updateMany則是符合條件的所有資料,都會進行更新。
product.bulkWrite([
{
updateOne: {
"filter": { category: "食品" }, // 尋找要更新資料的條件
"update": { price: 3000 } // 寫入要更新的欄位
}
}
]);
// 被更新的資料
{ name: "帝王蟹", price: 3000, amount: 3, category: "食品" }
與updateOne不同的是,replaceOne會直接將整筆資料替換掉,所以要替換的資料一定要寫完整,如果像下面的範例只寫{ price: 3000 },會導致寫入不完整的資料,進入資料庫內。
product.bulkWrite([
{
replaceOne: {
"filter": { name: "帝王蟹" }, // 設定要被取代的資料條件
"replacement": { price: 3000 } // 取代的資料
}
}
]);
// 最後帝王蟹這筆資料會變成
{ _id: 3, price: 3000 }
replaceOne還可以透過設定upsert: true
,當無法搜尋到符合條件的資料,並且取代,這時候會自動插入一筆資料進入collection,預設是upsert: false
。
product.bulkWrite([
{
replaceOne: {
"filter": { category: "文具用品" },
"replacement": {
name: "鉛筆",
price: 3000,
amount: 30,
category: "文具用品"
},
"upsert": true
}
}
]);
// 多新增一筆資料
{ _id: 5, name: "鉛筆", price: 3000, amount: 30, category: "文具用品" }
如果我們想要刪除資料可以使用deleteOne或deleteMany,差別一樣是deleteOne只會刪除符合filter條件的第一筆資料,而deleteMany則是刪除符合條件的所有資料。
product.bulkWrite([
{
deleteOne: {
"filter": { name: "帝王蟹" } // 設定要刪除資料的條件
}
}
]);
如果對bulkWrite有興趣想要深入了解,可以參考官方文件
本篇文章同步放在我的部落格,大家有空可以進來逛逛